//需要js-md5的支持 用来判断子数据是否更新
//需要自己封装的request______
class data_update {  
    constructor(obj) {  
        // obj={
        //     type:"request",//通过请求获取数据
        //     method:"get",//请求类型
        //     url:'请求url',//
        //     data:'初始数据',
        // }
      
      let _this=this;
      _this.init_flag=false;//是否完成第一次获取配置
      _this.init_func_lst=[];//在获取第一次数据前 要运行的配置函数
      _this.set_init_flag_ok=function(){
        _this.init_flag=true//完成第一次获取配置
        console.log("运行待处理函数",_this.init_func_lst.length);
        for (let i=0;i<_this.init_func_lst.length;i++){_this.init_func_lst[i]();}//开始分配配置数据
    }
      //数据
      _this.data={};
      if (obj.data){_this.data=JSON.parse(JSON.stringify(obj.data));}
      //前置执行的函数
      _this.before_funcs=[];
      //待更新的列表
      _this.update_func_lst=[]; 
      //获取数据
      if (obj.type=='request'){
        _this.request=request______({method:obj.method,url:obj.url});
        _this.get=function(){
            _this.request({execute_lst:[
                {'type':'set_val',val1:[{'val':_this},'val.data'],val2:'received_data'},
                {'type':'func',func:_this.update},
                {"type":"func",func:_this.set_init_flag_ok}
            ]})
                

        };
      }

    // 添加前置执行函数
    _this.add_before_func=function(func){
        _this.before_funcs.push(func);
    }
    // 增加待更新函数
    _this.add=function(obj){
        // obj={
        //     type:'try1',//首次执行报错跳过，后续再执行如果报错就删除当前对象
        //     type:'try2',//执行后如果报错就删除对象
        //     type:'try3',//报错不删除对象
        //     func:'',//要运行的函数名称
        //     check_param_path:'',//要检查的数据有变动的索引  如{a:{b:1}}变为{a:{b:2}} 这里值就为a.b
        // }
        obj.old_md5_val='';//最新数据与此md5比对 相同则不更新
        obj.try1_flag=0;//try1的参数 0表示没有运行过 1表示运行过一次
        _this.update_func_lst.push(obj);
        //主动获取数据的函数函数
        let res_func=function(){
            if (_this.init_flag==false){
                console.log("将当前函数存入待处理");
                wait_res_func();//将当前函数存入待处理
                return null;
            }
            let temp=_this.data;
            let temp2 = obj.check_param_path.split(".");  
            for(let j=0;j<temp2.length;j++){temp=temp[temp2[j]]}
            try{obj.func(temp);}catch{}
        }
        let wait_res_func=function(){_this.init_func_lst.push(res_func);}
        return res_func
    }
      _this.update=function(){
        //先执行 _this.before_funcs
        for(let i=0;i<_this.before_funcs.length;i++){
            try{_this.before_funcs[i](_this.data);}catch{}
        }
        let temp={};//要更新的数据
        let temp2=[];//拆分的字符串
        let new_md5_val='';
        for (let i=_this.update_func_lst.length-1;i>=0;i--){
            obj=_this.update_func_lst[i];
            console.log("start try")
            try{
                temp=_this.data;
                temp2 = obj.check_param_path.split(".");  
                for(let j=0;j<temp2.length;j++){temp=temp[temp2[j]]}
                new_md5_val=md5(JSON.stringify(temp));//获取最新的md5
                if (new_md5_val!=obj.old_md5_val){
                    obj.func(temp);//运行函数 更新数据
                    obj.old_md5_val=new_md5_val;//更新md5
                    if (obj.try1_flag==0){obj.try1_flag=1;}//更新try1标志
                }
            }catch{
                if((obj.type=='try1'&&obj.try1_flag==1) || (obj.type=='try2')){
                    _this.update_func_lst.slice(i,1);//删除
                }
            }
        }
    };
    _this.get_data=function(){
        return _this.data
    }  
    }
    
  }  
    
//   // 创建对象  
//   let test = new data_update({"data":{'a':{"b":1}}});  
//    obj={
//             type:'try1',//首次执行报错跳过，后续再执行如果报错就删除当前对象
//             func:function(data){console.log('更新:',data)},//要运行的函数名称
//             check_param_path:'a.b',//要检查的数据有变动的索引  如{a:{b:1}}变为{a:{b:2}} 这里值就为a.b
//         }
//   test.add(obj)
//   test.update();
//   test.data.a.b=3;
//   test.update();
//   test.update();
//   //通过请求获取数据
  
//   obj2={
//     type:"request",//通过请求获取数据
//     method:"get",//请求类型
//     url:'请求url',//
//     data:'初始数据',
//     }
//   window.config_now = new data_update(obj2);  